% 编写中值滤波算法    
% 输入参数:
%   image     - 需要进行中值滤波的图像
%   kernelSize- 滤波窗口的大小，本例中为3x3   
function medFilteredImage = medianFilter(image, kernelSize) 

    [height, width] = size(image);  
    padSize = floor(kernelSize/2);  

    % 对图像进行边缘填充，可以选择合适的填充方法，这里使用边缘复制的方法作为示例
    paddedImage = padarray(image, [padSize, padSize]);

    % 初始化中值滤波后的图像
    medFilteredImage = zeros(height, width, class(image));  

    for i = padSize+1 : height-padSize
        for j = padSize+1 : width-padSize
            % 从填充后的图像中提取当前像素为中心的kernelSize x kernelSize邻域
            neighborhood = paddedImage(i-padSize:i+padSize, j-padSize:j+padSize);
            
            % 计算该邻域内所有像素值的中值，并赋值给medFilteredImage对应位置的像素
            medFilteredImage(i, j) = median(neighborhood(:));
        end
    end

    % 处理边界，直接从原图像复制边缘像素到结果图像的相应位置
    medFilteredImage(1:padSize, :) = image(1:padSize, :);
    medFilteredImage(end-(padSize-1):end, :) = image(end-(padSize-1):end, :);
    medFilteredImage(:, 1:padSize) = medFilteredImage(:, padSize+1);
    medFilteredImage(:, end-(padSize-1):end) = medFilteredImage(:, end-padSize);

end
